/* =============================================================================
 * PROJET           	: Matrices creuses
 * NOM DU FICHIER   	: Matrices_creuses.h
 * OBJET            	: Definition du paquetage exportant le type t_Matrice
 * --------------------------------------------------------------------------------
 * DATE DE CREATION 	: 03/04/2009
 * AUTEUR           	: Ivan VALIMAHAMED, Sha LIU, Yves BOGE
 * --------------------------------------------------------------------------------
 * MODIFICATIONS (   n) date - auteur - description )
 * ============================================================================= */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>


/*
 * ------------------------------------------------------------------------------
 *	Definition des structures
 * ------------------------------------------------------------------------------
 */


/*
 *	NOM TYPE				:	t_Litteral
 *	FONCTION				:	stockage d'un litteral
 * CARACTERISTIQUES	:	Num_clause	(numero de la clause contenant le litteral)
 *							:	Num_var		(numero du litteral)
 *							:	Signe			(booleen : vrai si positif, faux si negatif)
 *							:	Val			(valeur du litteral : 0, 1, ou 2 = neutre)
 */
typedef struct
{
	int Num_clause;
	int Num_var;
	bool Signe;
	int Val;
} t_Litteral;


/*
 *	NOM TYPE				:	t_Elem
 *	FONCTION				:	element de la matrice
 * CARACTERISTIQUES	:	X					(litteral contenu dans l'element)
 *							:	var_suiv			(pointeur sur la variable suivante de la clause courante)
 *							:	clause_suiv 	(pointeur sur la clause suivante qui utilise la variable)
 */
typedef struct 
{
	t_Litteral X;
	struct t_Elem* Var_suiv;
	struct t_Elem* Clause_suiv;
} t_Elem;


/*
 *	NOM TYPE				:	t_Clause
 *	FONCTION				:	descripteur de la liste des litteraux contenus dans la clause
 * CARACTERISTIQUES	:	Etat				(etat de la clause, peut prendre les valeurs O ("falsifiee"), 
 *							:						1 ("satisfaite"), 2 ("inchangee"), 3 ("raccourcie"))
 *							:	Nb_neutres		(nombre de litteraux neutres contenus dans la clause)
 *							:	Nb_satisfaits	(nombre de litteraux satisfaits contenus dans la clause)
 * 						:	Nb_falsifies	(nombre de litteraux falsifies contenus dans la clause)
 *							:	Premier			(pointeur sur le premier litteral de la clause s'il existe, NULL sinon)
 */
typedef struct 
{
	int Etat;
	int Nb_neutres;
	int Nb_satisfaits;
	int Nb_falsifies;
	t_Elem* Premier;
} t_Clause;


/*
 *	NOM TYPE					:	t_Variable
 *	FONCTION					:	descripteur de la liste des litteraux pour une variable donnee
 * CARACTERISTIQUES		:	Premier	(pointeur sur le premier litteral contenant la variable s'il existe, NULL sinon)
 *								:	Valeur (Valeur prise par la variable, c'est a dire 0, 1 ou neutre (=2)
 */
typedef struct 
{
	t_Elem* Premier;
	int Valeur;
} t_Variable;


/*
 *	NOM TYPE				:	t_Matrice
 *	FONCTION				:	matrice de litteraux
 *	CARACTERISTIQUES	:	var				(tableau de variables (taille définie ulterieurement))
 *							:	clause			(tableau de clauses (taille définie ulterieurement))
 *							:	Nb_var			(nombre de variables de l'equation)
 *							:	Nb_clauses		(nombre de clause de l'equation)
 *							:	Dernier_elem	(pointeur sur le dernier element de la matrice (pour faciliter l'ajout))
 */
typedef struct 
{
	t_Variable* Var;
	t_Clause* Clause;
	int Nb_var, Nb_clauses;
	t_Elem* Dernier_elem;
} t_Matrice;



/* 
 * ------------------------------------------------------------------------------
 *	Declaration des fonctions du paquetage
 * ------------------------------------------------------------------------------ 
 */
 


/* 
 *	NOM 			: Ajout_Element
 *	ENTREES 		: i_E : element a inserer dans la matrice
 *					: io_Mat : matrice dans laquelle on souhaite inserer l'element
 *	SORTIES		: pointeur sur l'element ajoute
 *	BUT			: ajout d'un element dans la matrice
 */
 
void Ajout_element(t_Elem* i_E , t_Matrice* io_Mat);


/* 
 *	NOM 			: Affiche_matrice
 *	ENTREES 		: io_Mat : matrice a afficher
 *	SORTIES		: affichage de la matrice
 *	BUT			: afficher l'etat actuel de la matrice
 */
 
void Aff_matrice(t_Matrice* io_Mat);


/* 
 *	NOM 			: Clause_suivante
 *	ENTREES 		: i_E : element dont on veut le successeur dans la liste des clauses
 *	SORTIES		: pointeur sur l'element suivant dans la liste des clauses
 *	BUT			: permettre le parcours vertical de la matrice
 */
 
t_Elem* Clause_suivante(t_Elem* i_E);


/* 
 *	NOM 			: Var_suivante
 *	ENTREES 		: i_E : element dont on veut le successeur dans la liste des variables
 *	SORTIES		: pointeur sur l'element suivant dans la liste des variables
 *	BUT			: permettre le parcours horizontal de la matrice
 */
 
t_Elem* Var_suivante(t_Elem* i_E);
